package usuarios;

import java.util.ArrayList;
import java.util.List;

import org.uqbar.commons.utils.Observable;

import asientos.Vuelo;

@Observable
public class Usuario {
	
	private String nombre="";
	private String apellido="";
	private String dni="";
	
	private CategoriaUsuario categoria;
	private static Usuario instance;
	private List<Vuelo> asientosComprados=new ArrayList<Vuelo>();
	private List<Vuelo> asientosReservados=new ArrayList<Vuelo>();
	
	
	public List<Vuelo> getAsientosComprados() {		
		return asientosComprados;
	}

	public void setAsientosComprados(List<Vuelo> asientosComprados) {
		this.asientosComprados = asientosComprados;
	}

	public static Usuario getInstance(){
		if (instance == null) {
			instance = new Usuario("Pepe","Fernandez","101010110",new CategoriaUsuarioVip());			
		}		
		return instance;
	}
	
	
	/* *************************************************
	 * CONSTRUCTORS
	 **************************************************/
	public Usuario(String nombre, String apellido, String dni, CategoriaUsuario categoria) {
		this.setNombre(nombre);
		this.setApellido(apellido);
		this.setDni(dni);
		this.setCategoria(categoria);
	}
	
	/* *************************************************
	 * ACCESORS
	 **************************************************/
	public String getDni() {
		return dni;
	}
	public Usuario setDni(String dni) {
		this.dni = dni;
		
		return this;
	}
	
	public String getApellido() {
		return apellido;
	}
	public Usuario setApellido(String apellido) {
		this.apellido = apellido;
	
		return this;
	}
	
	public String getNombre() {
		return nombre;
	}
	public Usuario setNombre(String nombre) {
		this.nombre = nombre;
		
		return this;
	}
	
	public Usuario setCategoria(CategoriaUsuario categoria) {
		this.categoria = categoria;
		
		return this;
	}
	public CategoriaUsuario getCategoria() {
		return categoria;
	}
	
	public boolean tieneCuentaPaga(){
		return this.categoria.cuentaPaga();
	}
	
	public boolean debeVer(Vuelo unAsiento) {
		return this.categoria.debeVer(unAsiento);
	}

	public boolean puedeHacerReservas() {
		return this.categoria.puedeHacerReservas();
	}

	public void registrarCompra(Vuelo asientoComprado) {
		this.asientosComprados.add(asientoComprado);
		
	}
	
	public void registrarReserva(Vuelo asientoComprado) {
		this.asientosReservados.add(asientoComprado);
		
	}

	public void setAsientosReservados(List<Vuelo> asientosReservados) {
		this.asientosReservados = asientosReservados;
	}

	public List<Vuelo> getAsientosReservados() {
		return asientosReservados;
	}

	public void eliminarReserva(Vuelo vueloReservado) {
		List<Vuelo> asientosPendientesDeCompra = new ArrayList<Vuelo>();
			
		for (int i = 0; i < this.asientosReservados.size(); i++) {
			if (!(vueloReservado.equals(this.asientosReservados.get(i)))) {
				asientosPendientesDeCompra.add(asientosReservados.get(i));
			}
		}
		asientosReservados.clear();
		asientosReservados.addAll(asientosPendientesDeCompra);
		
	}


}